package tech.aistar.corejava.day13;

/**
 * @author success
 * @version 1.0
 * @description:本类用来演示:递归算法
 *               递归算法计算性能比较低下 - 因为每次计算的时候都会把中间的计算的结果在内存中保存着
 * @date 2019/8/1 0001
 */
public class ResursionDemo {

    public static void main(String[] args) {
       // System.out.println(fei(5));//55
       // System.out.println(getYangHui(4,2));

        System.out.println(getCommont(20,12));
    }

    /**
     * 1 1 2 3 5 8 13 21 34 55 ..
     * @param n 位置
     * @return 该位置的斐波那契数
     */
    public static int fei(int n){
        //1. 找出递归的出口 - 否则java.lang.StackOverflowError
        if(n==1 || n==2)
            return 1;
        //2. 方法体中调用自己
        return fei(n-2)+fei(n-1);

        // fei(3) + fei(4)
        //fei(1)+fei(2) + fei(2)+fei(3)
        //1 + 1 + 1 + fei(3)
        //3 + fei(1) + fei(2) = 3 + 1 + 1 = 5
    }

    /**
     *  1
     *  1 1
     *  1 2 1
     *  1 3 3 1
     *  1 4 6 4 1
     *  1 5 10 10 5 1`

     * @param x 行
     * @param y 列
     * @return x,y坐标对应的杨辉三角的值
     */
    public static int getYangHui(int x,int y){
        if(y==1 || x == y)
            return 1;
        return getYangHui(x-1,y-1) + getYangHui(x-1,y);

        //gy(3,3)+gy(3,4)
        //gy(2,2)+gy(2,2) + gy(2,3) + gy(2,4)
        //1 + 1 + gy(1,2) +gy(1,2)
    }

    /**
     * 求俩个数的最大公约数
     * @param m
     * @param n
     * @return
     */
    public static int getCommont(int m,int n){//20 12
        //1. 指定递归的出口
        if(m % n == 0)
            return n;
        return getCommont(n,m%n);

        //return gc(12,8);
        //return gc(8,12%8)
        //
    }
}
